/**
 * @file bsp.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2023-03-20
 *
 * @copyright Copyright (c) 2023
 *
 */

#include "bsp.h"

/**
 * @brief bsp init 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
 *
 */
void bsp_Init(void)
{
#if Enable_EventRecorder == 1
	/* 初始化EventRecorder并开启 */
	EventRecorderInitialize(EventRecordAll, 1U);
	EventRecorderStart();
#endif
	bsp_InitLed(LED0); /* 初始化LED */
	bsp_InitKey();	   /* 按键初始化，要放在滴答定时器之前，因为按钮检测是通过滴答定时器扫描 */
	bsp_InitTimer();   /* 初始化滴答定时器 包括了硬件定时器*/
}

/*
*********************************************************************************************************
*	函 数 名: Error_Handler
*	形    参: file : 源代码文件名称。关键字 __FILE__ 表示源代码文件名。
*			  line ：代码行号。关键字 __LINE__ 表示源代码行号
*	返 回 值: 无
*		Error_Handler(__FILE__, __LINE__);
*********************************************************************************************************
*/

/**
 * @brief Error_Handler 调用示例 Error_Handler(__FILE__, __LINE__);
 *
 * @param file 源代码文件名称。关键字 __FILE__ 表示源代码文件名。
 * @param line 代码行号。关键字 __LINE__ 表示源代码行号
 */
void Error_Handler(char *file, uint32_t line)
{
	/*
		用户可以添加自己的代码报告源代码文件名和代码行号，比如将错误文件和行号打印到串口
		printf("Wrong parameters value: file %s on line %d\r\n", file, line)
	*/

	/* 这是一个死循环，断言失败时程序会在此处死机，以便于用户查错 */
	if (line == 0)
	{
		return;
	}

	while (1)
	{
	}
}


/**
 * @brief 该函数每隔10ms被Systick中断调用1次。详见 bsp_timer.c的定时中断服务程序。一些处理时间要求不严格的
 *			任务可以放在此函数。比如：按键扫描、蜂鸣器鸣叫控制等。
 *
 */
void bsp_RunPer10ms(void)
{
	bsp_KeyScan10ms();
}

/**
 * @brief 该函数每隔1ms被Systick中断调用1次。详见 bsp_timer.c的定时中断服务程序。一些需要周期性处理的事务
 *	     可以放在此函数。比如：触摸坐标扫描。
 *
 */
void bsp_RunPer1ms(void)
{
}

/**
 * @brief 空闲时执行的函数。一般主程序在for和while循环程序体中需要插入 CPU_IDLE() 宏来调用本函数。本函数缺省为空操作。用户可以添加喂狗、设置CPU进入休眠模式的功能。
 *
 */
void bsp_Idle(void)
{
	/* --- 喂狗 */

	/* --- 让CPU进入休眠，由Systick定时中断唤醒或者其他中断唤醒 */
}

/*
*********************************************************************************************************
*	函 数 名: HAL_Delay
*	功能说明: 重定向毫秒延迟函数。替换HAL中的函数。因为HAL中的缺省函数依赖于Systick中断，如果在USB、SD卡
*             中断中有延迟函数，则会锁死。也可以通过函数HAL_NVIC_SetPriority提升Systick中断
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
/* 当前例子使用stm32h7xx_hal.c默认方式实现，未使用下面重定向的函数 */
#if 0
void HAL_Delay(uint32_t Delay)
{
	bsp_DelayUS(Delay * 1000);
}
#endif
